import requests
import json


class DoubanSpider:
    def __init__(self):
        self.url_temp_list = [
            # "https://m.douban.com/rexxar/api/v2/subject_collection/tv_american/items?os=ios&for_mobile=1&callback=jsonp1&start=0&count=18&loc_id=108288&_=1577608051449",
            {
                "url_temp": "https://m.douban.com/rexxar/api/v2/subject_collection/tv_american/items?start={}&count=18&loc_id=108288",
                "country": "US"
            },
            {
                "url_temp": "https://m.douban.com/rexxar/api/v2/subject_collection/tv_domestic/items?start={}&count=18&loc_id=108288",
                "country": "CN"
            },
        ]
        self.headers = {
            "Referer": "https://m.douban.com/tv/american",
            "User-Agent": "Mozilla/5.0 (iPhone; CPU iPhone OS 11_0 like Mac OS X) AppleWebKit/604.1.38 (KHTML, like Gecko) Version/11.0 Mobile/15A372 Safari/604.1"
        }

    def parse_url(self, url):  # 发送请求，获取响应
        r = requests.get(url, headers=self.headers)
        return r.content.decode()

    def get_content_list(self, json_str):  # 提取数据
        dict_ret = json.loads(json_str)
        content_list = dict_ret["subject_collection_items"]
        total = dict_ret["total"]
        return content_list, total

    def save_content_list(self, content_list, country):  # 保存
        with open("豆瓣.txt", "a", encoding="utf-8") as f:
            for content in content_list:
                content["country"] = country # 加入国家属性
                # 错：f.write(json.dumps(content),ensure_ascii=False)
                f.write(json.dumps(content, ensure_ascii=False))
                f.write("\n")
        print("保存成功！")

    def run(self):
        for url_temp in self.url_temp_list:
            num = 0
            # while True:
            #     # 1.发送请求
            #     url = self.url_temp.foramt(num)
            #     json_str = self.parse_url(url)
            #     # 2.得到数据
            #     content_list,total = self.get_content_list(json_str)
            #     # 3.保存
            #     self.save_content_list(content_list)
            #     if len(content_list)<18:
            #         break
            #     # 4.翻页
            #     num += 18
            total = 100  # 假设存在第一页
            while num < total+18:  # 不能等于
                # 0.构造url地址
                url = url_temp["url_temp"].format(num)
                # 1.发送请求，获取响应
                json_str = self.parse_url(url)
                # 2.提取数据
                content_list, total = self.get_content_list(json_str)
                # 3.保存
                self.save_content_list(content_list,url_temp["country"])
                # 4.翻页，进入循环
                num += 18


if __name__ == '__main__':
    douban_spider = DoubanSpider()
    douban_spider.run()

"""
注意1：进入豆瓣电视剧手机版页面需要从手机版首页进入
注意2：json文件和js文件（方法）是两码事
    寻找json文件，js、css、png文件都不需要看
注意3：url原地址有很多可以删掉
注意4：浏览器请求豆瓣的时候headers还有另一个东西Referer：，不带上的话是无法访问json数据的    
"""
